package com.example.springboot_test.easyexcel.model.common;

import com.example.springboot_test.common.poi.util.POIExcelUtil;
import com.example.springboot_test.easyexcel.annotation.ReflectField;
import com.example.springboot_test.easyexcel.model.builder.common.FontModelBuilder;
import lombok.Getter;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFColor;

/**
 * 字体信息
 *
 * @author xudongmaster
 */
@Getter
public class FontModel {
    /**
     * 字体名称
     */
    @ReflectField(invokeMethodName = "setFontName")
    private final String fontName;
    /**
     * 字体大小
     */
    @ReflectField(invokeMethodName = "setFontHeight")
    private final Double fontHeight;
    /**
     * 字体颜色
     */
    @ReflectField(invokeMethodName = "setColor")
    private final Object fontColor;
    /**
     * 字体加粗
     */
    @ReflectField(invokeMethodName = "setBold")
    private final Boolean fontBold;
    /**
     * 字体斜体
     */
    @ReflectField(invokeMethodName = "setItalic")
    private final Boolean fontItalic;
    /**
     * 字体下划线
     */
    @ReflectField(invokeMethodName = "setUnderline")
    private final Byte fontUnderLine;
    /**
     * 字体上标下标
     */
    @ReflectField(invokeMethodName = "setTypeOffset")
    private final Short fontTypeOffset;
    /**
     * 字体删除线
     */
    @ReflectField(invokeMethodName = "setStrikeout")
    private final Boolean fontStrikeout;

    public FontModel(FontModelBuilder builder) {
        this.fontName = builder.getFontName();
        this.fontHeight = builder.getFontHeight();
        this.fontColor = builder.getFontColor();
        this.fontBold = builder.getFontBold();
        this.fontItalic = builder.getFontItalic();
        this.fontUnderLine = builder.getFontUnderLine();
        this.fontTypeOffset = builder.getFontTypeOffset();
        this.fontStrikeout = builder.getFontStrikeout();
    }

    /**
     * 生成字体名称字体信息
     *
     * @param fontName 字体名称（默认宋体）
     * @return 字体信息
     */
    public static FontModel createFontNameFontModel(String fontName) {
        return createFontModel(fontName, null, null, null, null, null, null, null);
    }

    /**
     * 生成字体名称大小字体信息
     *
     * @param fontHeight 字体大小
     * @return 字体信息
     */
    public static FontModel createFontHeightFontModel(Double fontHeight) {
        return createFontModel(null, fontHeight, null, null, null, null, null, null);
    }

    /**
     * 生成字体颜色字体信息（支持自定义RGB颜色）
     *
     * @param redNum   红色数值
     * @param greenNum 绿色数值
     * @param blueNum  蓝色数值
     * @return 字体信息
     */
    public static FontModel createFontColorFontModel(int redNum, int greenNum, int blueNum) {
        XSSFColor fontColor = POIExcelUtil.getXSSFRGBColor(redNum, greenNum, blueNum);
        return createFontColorFontModel(fontColor);
    }

    /**
     * 生成字体颜色字体信息
     *
     * @param fontColor 字体颜色
     * @return 字体信息
     */
    public static FontModel createFontColorFontModel(Object fontColor) {
        return createFontModel(null, null, fontColor, null, null, null, null, null);
    }

    /**
     * 生成字体加粗字体信息
     *
     * @param fontBold    字体加粗
     * @return 字体信息
     */

    public static FontModel createFontBoldFontModel( Boolean fontBold) {
        return createFontModel(null, null, null, fontBold, null, null, null, null);
    }

    /**
     * 生成字体斜体字体信息
     *
     * @param fontItalic  字体斜体
     * @return 字体信息
     */
    public static FontModel createFontItalicFontModel(Boolean fontItalic) {
        return createFontModel(null, null, null, null, fontItalic, null, null, null);
    }

    /**
     * 生成字体下划线字体信息
     *
     * @param fontUnderLine 字体下划线
     * @return 字体信息
     */

    public static FontModel createFontUnderLineFontModel(Byte fontUnderLine) {
        return createFontModel(null, null, null, null, null, fontUnderLine, null, null);
    }

    /**
     * 生成字体上标下标字体信息
     *
     * @param fontTypeOffset 字体上标下标
     * @return 字体信息
     */

    public static FontModel createFontTypeOffsetFontModel( Short fontTypeOffset) {
        return createFontModel(null, null, null, null, null, null, fontTypeOffset, null);
    }

    /**
     * 生成字体删除线字体信息
     *
     * @param fontStrikeout 字体删除线
     * @return 字体信息
     */
    public static FontModel createFontStrikeoutFontModel(Boolean fontStrikeout) {
        return createFontModel(null, null, null, null, null, null, null, fontStrikeout);
    }

    /**
     * 创建字体信息
     *
     * @param fontName       字体名称
     * @param fontHeight     字体大小
     * @param fontColor      字体颜色
     * @param fontBold       字体加粗
     * @param fontItalic     字体斜体
     * @param fontUnderLine  字体下划线
     * @param fontTypeOffset 字体上标下标
     * @param fontStrikeout  字体删除线
     * @return 字体信息
     */
    public static FontModel createFontModel(String fontName, Double fontHeight, Object fontColor, Boolean fontBold, Boolean fontItalic, Byte fontUnderLine
            , Short fontTypeOffset, Boolean fontStrikeout) {
        return new FontModelBuilder()
                //字体名称
                .fontName(fontName)
                //字体大小
                .fontHeight(fontHeight != null && fontHeight <= 0 ? null : fontHeight)
                //字体颜色
                .fontColor(fontColor != null && (!(fontColor instanceof IndexedColors) && !(fontColor instanceof XSSFColor))
                        ? null : fontColor)
                //字体加粗
                .fontBold(fontBold)
                //字体斜体
                .fontItalic(fontItalic)
                //字体下划线
                .fontUnderLine(fontUnderLine != null && (fontUnderLine != Font.U_NONE && fontUnderLine != Font.U_SINGLE && fontUnderLine != Font.U_DOUBLE
                        && fontUnderLine != Font.U_DOUBLE_ACCOUNTING && fontUnderLine != Font.U_SINGLE_ACCOUNTING) ? null : fontUnderLine)
                //字体上标下标
                .fontTypeOffset(fontTypeOffset != null && (fontTypeOffset != Font.SS_NONE && fontTypeOffset != Font.SS_SUB && fontTypeOffset != Font.SS_SUPER)
                        ? null : fontTypeOffset)
                //字体删除线
                .fontStrikeout(fontStrikeout)
                .build();
    }
}
